// Copyright (c) 2012 Ecma International.  All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
es5id: 15.2.3.6-4-172
description: >
    Object.defineProperty - 'O' is an Array, 'name' is the length
    property of 'O', the [[Value]] field of 'desc' is less than value
    own data property with large index named in 'O' that overrides an
    inherited data property can stop deleting index named properties
    (15.4.5.1 step 3.l.ii)
---*/

function Test() {
    var arrObj = [0, 1];

    assert.throws(TypeError, function() {
      Object.defineProperty(arrObj, "1", {
        configurable: false
      });

      Array.prototype[1] = 2;
      Object.defineProperty(arrObj, "length", {
        value: 1
      });
    });
    assert.sameValue(arrObj.length, 2, 'arrObj.length');
    assert(arrObj.hasOwnProperty("1"), 'arrObj.hasOwnProperty("1") !== true');
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
